package com.twb.easyExcel.listener;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.fastjson.JSON;
import com.twb.easyExcel.service.IEasyExcelService;

/**
 * @ClassName EasyExcelListener
 * @Description excel读取的监听器
 * @author DHL
 * @date 2021年8月11日 上午10:25:44
 */
@SuppressWarnings("all")
public class EasyExcelListener<T> extends AnalysisEventListener<T> {

	protected static Logger log = LoggerFactory.getLogger(EasyExcelListener.class);

	/**
	 * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
	 */
	private static int BATCH_COUNT = 1000;
	List list = new ArrayList();

	IEasyExcelService easyExcelService;

	/**
	 * Description 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
	 *
	 * @param easyExcelService 传入批量处理的接口,每达到多少条就进行一次批量处理
	 *
	 * @author DHL
	 * 
	 * @Create date 2021-08-11 10:28:58
	 */
	public EasyExcelListener(IEasyExcelService easyExcelService) {
		this.easyExcelService = easyExcelService;
	}

	/**
	 * Description 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
	 *
	 * @param easyExcelService 传入批量处理的接口,每达到多少条就进行一次批量处理
	 * @param batchCount       每次解析的数量
	 *
	 * @author DHL
	 * 
	 * @Create date 2021-08-11 10:28:58
	 */
	public EasyExcelListener(IEasyExcelService easyExcelService, int batchCount) {
		this.easyExcelService = easyExcelService;

		this.BATCH_COUNT = batchCount;
	}

	/**
	 * 每一条数据解析都会来调用
	 */
	@Override
	public void invoke(T data, AnalysisContext context) {
		log.debug("文档解析标题为:{},解析到一条数据:{}", easyExcelService.getTitle(), JSON.toJSONString(data));

		list.add(data);

		// 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
		if (list.size() >= BATCH_COUNT) {
			saveData();
			// 存储完成清理 list
			list.clear();
		}
	}

	/**
	 * 所有数据解析完成了 都会来调用
	 */
	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		// 这里也要保存数据，确保最后遗留的数据也存储到数据库
		saveData();

		log.debug("所有数据解析完成！,读取的标题是:{}", easyExcelService.getTitle());
	}

	@Override
	public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
		System.out.println(1);
	}

	/**
	 * 这边是判断读取到了表头
	 */
	@Override
	public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {

		easyExcelService.checkexlHead(headMap);	// 检查表头
	}

	/**
	 * @Title saveData
	 * @Description 存储数据库
	 * @author DHL
	 * @date 2021年8月11日 上午10:32:45
	 */
	private void saveData() {
		log.debug("{}条数据，开始存储数据库！,读取的标题是{}", list.size(), easyExcelService.getTitle());
		try {
			easyExcelService.saveList(list);

			log.debug("存储数据库成功！读取的标题是:{}", easyExcelService.getTitle());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
